package models

import (
	"time"

	"github.com/beego/beego/v2/client/orm"
	"github.com/beego/beego/v2/core/logs"
)

// Douyin 抖音配置信息
type Douyin struct {
	BaseModel
	StoreId      int64  `orm:"index" json:"store_id"`            // 关联门店ID
	StoreName    string `orm:"size(100)" json:"store_name"`      // 门店名称（冗余字段）
	AppKey       string `orm:"size(100)" json:"app_key"`         // 抖音开放平台应用AppKey
	AppSecret    string `orm:"size(100)" json:"app_secret"`      // 抖音开放平台应用AppSecret
	PoiId        string `orm:"size(50)" json:"poi_id"`           // 抖音门店ID（POI ID）
	Status       int    `orm:"default(1)" json:"status"`         // 状态：0-禁用，1-启用
	SyncInterval int    `orm:"default(30)" json:"sync_interval"` // 订单同步间隔（分钟）
	LastSyncTime int64  `json:"last_sync_time"`                  // 最后同步时间
}

// DouyinGroup 抖音团购活动
type DouyinGroup struct {
	BaseModel
	DouyinId      int64  `orm:"index" json:"douyin_id"`           // 关联抖音配置ID
	StoreId       int64  `orm:"index" json:"store_id"`            // 门店ID
	StoreName     string `orm:"size(100)" json:"store_name"`      // 门店名称
	Title         string `orm:"size(200)" json:"title"`           // 团购活动标题
	Description   string `orm:"size(1000)" json:"description"`    // 团购活动描述
	OriginalPrice int    `json:"original_price"`                  // 原价(分)
	GroupPrice    int    `json:"group_price"`                     // 团购价(分)
	MinCount      int    `json:"min_count"`                       // 最小开团人数
	MaxCount      int    `json:"max_count"`                       // 最大开团人数
	StartTime     int64  `orm:"index" json:"start_time"`          // 活动开始时间戳(毫秒)
	EndTime       int64  `orm:"index" json:"end_time"`            // 活动结束时间戳(毫秒)
	Status        int    `orm:"default(1)" json:"status"`         // 状态：0-禁用，1-启用
	DouyinGroupId string `orm:"size(100)" json:"douyin_group_id"` // 抖音团购ID
	SoldCount     int    `orm:"default(0)" json:"sold_count"`     // 已售数量
	ActivityRules string `orm:"type(text)" json:"activity_rules"` // 活动规则
	ServiceTerms  string `orm:"type(text)" json:"service_terms"`  // 服务条款
	Images        string `orm:"type(text)" json:"images"`         // 团购图片，JSON数组
	LastSyncTime  int64  `json:"last_sync_time"`                  // 最后同步时间戳(毫秒)
}

// DouyinGroupOrder 抖音团购订单
type DouyinGroupOrder struct {
	BaseModel
	DouyinGroupId    int64  `orm:"index" json:"douyin_group_id"`     // 关联抖音团购活动ID
	DouyinId         int64  `orm:"index" json:"douyin_id"`           // 关联抖音配置ID
	StoreId          int64  `orm:"index" json:"store_id"`            // 门店ID
	StoreName        string `orm:"size(100)" json:"store_name"`      // 门店名称
	OrderId          string `orm:"size(100);unique" json:"order_id"` // 抖音订单号
	OrderTime        int64  `orm:"index" json:"order_time"`          // 下单时间戳(毫秒)
	GroupTitle       string `orm:"size(200)" json:"group_title"`     // 团购活动标题
	UserName         string `orm:"size(100)" json:"user_name"`       // 用户姓名
	UserPhone        string `orm:"size(20)" json:"user_phone"`       // 用户电话
	Quantity         int    `json:"quantity"`                        // 购买数量
	TotalPrice       int    `json:"total_price"`                     // 总金额(分)
	Status           string `orm:"size(50)" json:"status"`           // 订单状态
	ProcessStatus    string `orm:"size(50)" json:"process_status"`   // 处理状态：pending-待处理，accepted-已接单，rejected-已拒绝，completed-已完成
	IsProcessed      int    `orm:"default(0)" json:"is_processed"`   // 是否已处理：0-未处理，1-已处理
	ProcessTime      int64  `json:"process_time"`                    // 处理时间戳(毫秒)
	RefundStatus     string `orm:"size(50)" json:"refund_status"`    // 退款状态
	Remark           string `orm:"size(500)" json:"remark"`          // 备注
	DouyinRemark     string `orm:"size(500)" json:"douyin_remark"`   // 抖音备注
	VoucherCode      string `orm:"size(100)" json:"voucher_code"`    // 团购券码
	VoucherValidTime int64  `json:"voucher_valid_time"`              // 券有效期时间戳(毫秒)
	IsUsed           int    `orm:"default(0)" json:"is_used"`        // 是否已使用：0-未使用，1-已使用
	UseTime          int64  `json:"use_time"`                        // 使用时间戳(毫秒)
}

// GetDouyinList 获取抖音配置列表
func GetDouyinList(page, pageSize int, filters map[string]interface{}) ([]*Douyin, int64, error) {
	o := GetOrm()
	query := o.QueryTable(new(Douyin)).Filter("is_deleted", 0)

	// 应用过滤条件
	if storeId, ok := filters["store_id"].(int64); ok && storeId > 0 {
		query = query.Filter("store_id", storeId)
	}
	if status, ok := filters["status"].(int); ok {
		query = query.Filter("status", status)
	}
	// 加盟商只能查看自己的数据
	if franchiseId, ok := filters["franchise_id"].(int64); ok && franchiseId > 0 {
		query = query.Filter("franchise_id", franchiseId)
	}

	// 查询总数
	total, err := query.Count()
	if err != nil {
		logs.Error("获取抖音配置总数失败: %v", err)
		return nil, 0, err
	}

	// 查询分页数据
	var list []*Douyin
	_, err = query.OrderBy("-id").Limit(pageSize, (page-1)*pageSize).All(&list)
	if err != nil {
		logs.Error("获取抖音配置列表失败: %v", err)
		return nil, 0, err
	}

	return list, total, nil
}

// AddDouyin 添加抖音配置
func AddDouyin(douyin *Douyin) (int64, error) {
	o := GetOrm()
	id, err := o.Insert(douyin)
	if err != nil {
		logs.Error("添加抖音配置失败: %v", err)
		return 0, err
	}
	return id, nil
}

// GetDouyinById 根据ID获取抖音配置
func GetDouyinById(id int64) (*Douyin, error) {
	o := GetOrm()
	douyin := &Douyin{}
	douyin.BaseModel.Id = id
	err := o.Read(douyin)
	if err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		logs.Error("根据ID获取抖音配置失败: %v", err)
		return nil, err
	}
	if douyin.IsDeleted == 1 {
		return nil, nil
	}
	return douyin, nil
}

// GetDouyinByStoreId 根据门店ID获取抖音配置
func GetDouyinByStoreId(storeId int64) (*Douyin, error) {
	o := GetOrm()
	douyin := &Douyin{}
	err := o.QueryTable(new(Douyin)).
		Filter("store_id", storeId).
		Filter("is_deleted", 0).
		One(douyin)
	if err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		logs.Error("根据门店ID获取抖音配置失败: %v", err)
		return nil, err
	}
	return douyin, nil
}

// UpdateDouyin 更新抖音配置
func UpdateDouyin(douyin *Douyin) error {
	o := GetOrm()
	_, err := o.Update(douyin)
	if err != nil {
		logs.Error("更新抖音配置失败: %v", err)
		return err
	}
	return nil
}

// DeleteDouyin 删除抖音配置（软删除）
func DeleteDouyin(id int64) error {
	o := GetOrm()
	douyin := &Douyin{}
	douyin.BaseModel.Id = id
	err := o.Read(douyin)
	if err != nil {
		logs.Error("删除抖音配置时查询失败: %v", err)
		return err
	}
	douyin.IsDeleted = 1
	_, err = o.Update(douyin, "IsDeleted")
	if err != nil {
		logs.Error("删除抖音配置失败: %v", err)
		return err
	}
	return nil
}

// GetDouyinGroupList 获取抖音团购活动列表
func GetDouyinGroupList(page, pageSize int, filters map[string]interface{}) ([]*DouyinGroup, int64, error) {
	o := orm.NewOrm()
	query := o.QueryTable(new(DouyinGroup)).Filter("is_deleted", 0)

	// 应用过滤条件
	if storeId, ok := filters["store_id"].(int64); ok && storeId > 0 {
		query = query.Filter("store_id", storeId)
	}
	if status, ok := filters["status"].(int); ok && status != -1 {
		query = query.Filter("status", status)
	}
	if douyinId, ok := filters["douyin_id"].(int64); ok && douyinId > 0 {
		query = query.Filter("douyin_id", douyinId)
	}
	if title, ok := filters["title"].(string); ok && title != "" {
		query = query.Filter("title__icontains", title)
	}
	// 加盟商只能查看自己的数据
	if franchiseId, ok := filters["franchise_id"].(int64); ok && franchiseId > 0 {
		query = query.Filter("franchise_id", franchiseId)
	}

	// 计算总数
	total, err := query.Count()
	if err != nil {
		return nil, 0, err
	}

	// 分页查询
	var list []*DouyinGroup
	_, err = query.OrderBy("-id").Limit(pageSize).Offset((page - 1) * pageSize).All(&list)
	if err != nil {
		return nil, 0, err
	}

	return list, total, nil
}

// GetDouyinGroupByDouyinGroupId 根据抖音团购ID获取团购活动
func GetDouyinGroupByDouyinGroupId(douyinGroupId string) (*DouyinGroup, error) {
	o := GetOrm()
	group := &DouyinGroup{}
	err := o.QueryTable(new(DouyinGroup)).
		Filter("douyin_group_id", douyinGroupId).
		Filter("is_deleted", 0).
		One(group)
	if err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		logs.Error("根据抖音团购ID获取团购活动失败: %v", err)
		return nil, err
	}
	return group, nil
}

// GetDouyinGroupOrderList 获取抖音团购订单列表
func GetDouyinGroupOrderList(page, pageSize int, filters map[string]interface{}) ([]*DouyinGroupOrder, int64, error) {
	o := orm.NewOrm()
	query := o.QueryTable(new(DouyinGroupOrder)).Filter("is_deleted", 0)

	// 应用过滤条件
	if storeId, ok := filters["store_id"].(int64); ok && storeId > 0 {
		query = query.Filter("store_id", storeId)
	}
	if douyinId, ok := filters["douyin_id"].(int64); ok && douyinId > 0 {
		query = query.Filter("douyin_id", douyinId)
	}
	if douyinGroupId, ok := filters["douyin_group_id"].(int64); ok && douyinGroupId > 0 {
		query = query.Filter("douyin_group_id", douyinGroupId)
	}
	if status, ok := filters["status"].(string); ok && status != "" {
		query = query.Filter("status", status)
	}
	if processStatus, ok := filters["process_status"].(string); ok && processStatus != "" {
		query = query.Filter("process_status", processStatus)
	}
	if isProcessed, ok := filters["is_processed"].(int); ok && isProcessed != -1 {
		query = query.Filter("is_processed", isProcessed)
	}
	if isUsed, ok := filters["is_used"].(int); ok && isUsed != -1 {
		query = query.Filter("is_used", isUsed)
	}
	// 加盟商只能查看自己的数据
	if franchiseId, ok := filters["franchise_id"].(int64); ok && franchiseId > 0 {
		query = query.Filter("franchise_id", franchiseId)
	}
	if startTime, ok := filters["start_time"].(int64); ok && startTime > 0 {
		query = query.Filter("order_time__gte", startTime)
	}
	if endTime, ok := filters["end_time"].(int64); ok && endTime > 0 {
		query = query.Filter("order_time__lte", endTime)
	}

	// 计算总数
	total, err := query.Count()
	if err != nil {
		return nil, 0, err
	}

	// 分页查询
	var list []*DouyinGroupOrder
	_, err = query.OrderBy("-id").Limit(pageSize).Offset((page - 1) * pageSize).All(&list)
	if err != nil {
		return nil, 0, err
	}

	return list, total, nil
}

// AddDouyinGroupOrder 添加抖音团购订单
func AddDouyinGroupOrder(order *DouyinGroupOrder) (int64, error) {
	o := GetOrm()
	id, err := o.Insert(order)
	if err != nil {
		logs.Error("添加抖音团购订单失败: %v", err)
		return 0, err
	}
	return id, nil
}

// GetDouyinGroupOrderById 根据ID获取抖音团购订单
func GetDouyinGroupOrderById(id int64) (*DouyinGroupOrder, error) {
	o := orm.NewOrm()
	order := &DouyinGroupOrder{}
	order.Id = id
	err := o.Read(order)
	if err != nil {
		return nil, err
	}
	if order.IsDeleted == 1 {
		return nil, orm.ErrNoRows
	}
	return order, nil
}

// GetDouyinGroupOrderByOrderId 根据订单号获取订单
func GetDouyinGroupOrderByOrderId(orderId string) (*DouyinGroupOrder, error) {
	o := GetOrm()
	order := &DouyinGroupOrder{}
	err := o.QueryTable(new(DouyinGroupOrder)).
		Filter("order_id", orderId).
		Filter("is_deleted", 0).
		One(order)
	if err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		logs.Error("根据订单号获取订单失败: %v", err)
		return nil, err
	}
	return order, nil
}

// UpdateDouyinGroupOrder 更新抖音团购订单
func UpdateDouyinGroupOrder(order *DouyinGroupOrder) error {
	o := GetOrm()
	_, err := o.Update(order)
	if err != nil {
		logs.Error("更新抖音团购订单失败: %v", err)
		return err
	}
	return nil
}

// ProcessDouyinGroupOrder 处理抖音团购订单
func ProcessDouyinGroupOrder(id int64, status int) error {
	o := orm.NewOrm()
	order := &DouyinGroupOrder{}
	order.Id = id
	err := o.Read(order)
	if err != nil {
		return err
	}

	// 设置处理状态
	switch status {
	case 1: // 确认订单
		order.ProcessStatus = "accepted"
	case 2: // 拒绝订单
		order.ProcessStatus = "rejected"
	case 3: // 完成订单
		order.ProcessStatus = "completed"
	}

	order.IsProcessed = 1
	order.ProcessTime = time.Now().Unix() // 使用当前时间的毫秒时间戳

	_, err = o.Update(order)
	return err
}

// UseDouyinGroupOrder 使用抖音团购券
func UseDouyinGroupOrder(id int64) error {
	o := orm.NewOrm()
	order := &DouyinGroupOrder{}
	order.Id = id
	err := o.Read(order)
	if err != nil {
		return err
	}

	// 检查订单是否已使用
	if order.IsUsed == 1 {
		return nil
	}

	// 设置使用状态
	order.IsUsed = 1
	order.UseTime = time.Now().Unix() // 使用当前时间的毫秒时间戳

	_, err = o.Update(order)
	return err
}

// AddDouyinGroup 添加抖音团购活动
func AddDouyinGroup(group *DouyinGroup) (int64, error) {
	o := GetOrm()
	id, err := o.Insert(group)
	if err != nil {
		logs.Error("添加抖音团购活动失败: %v", err)
		return 0, err
	}
	return id, nil
}

// UpdateDouyinGroup 更新抖音团购活动
func UpdateDouyinGroup(group *DouyinGroup) error {
	o := GetOrm()
	_, err := o.Update(group)
	if err != nil {
		logs.Error("更新抖音团购活动失败: %v", err)
		return err
	}
	return nil
}

// DeleteDouyinGroup 删除抖音团购活动
func DeleteDouyinGroup(id int64) error {
	o := orm.NewOrm()
	group := &DouyinGroup{}
	group.Id = id
	err := o.Read(group)
	if err != nil {
		return err
	}
	group.IsDeleted = 1
	_, err = o.Update(group, "IsDeleted")
	return err
}

// GetDouyinGroupById 根据ID获取抖音团购活动
func GetDouyinGroupById(id int64) (*DouyinGroup, error) {
	o := GetOrm()
	group := &DouyinGroup{}
	err := o.QueryTable(new(DouyinGroup)).
		Filter("id", id).
		Filter("is_deleted", 0).
		One(group)
	if err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		logs.Error("根据ID获取抖音团购活动失败: %v", err)
		return nil, err
	}
	return group, nil
}

// GetDouyinGroupOrderByCode 根据券码获取抖音订单
func GetDouyinGroupOrderByCode(code string) (*DouyinGroupOrder, error) {
	o := orm.NewOrm()
	order := &DouyinGroupOrder{}
	err := o.QueryTable(new(DouyinGroupOrder)).Filter("voucher_code", code).One(order)
	if err != nil {
		if err == orm.ErrNoRows {
			return nil, nil
		}
		return nil, err
	}
	return order, nil
}
